package com.shujia.mllib

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.linalg
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD

object Demo1Vector {
  def main(args: Array[String]): Unit = {
    /**
     * 1、向量 --> 有方向 有值
     */

    // 稠密向量
    val dense_vec: linalg.Vector = Vectors.dense(Array(1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.1, 3.2, 4.3))
    println(dense_vec)

    // 稀疏向量
    // 只把非零的数据记录下来，相比稠密向量要更加节省空间
    val sparse_vec: linalg.Vector = Vectors.sparse(18, Array(0, 15, 16, 17), Array(1.0, 2.1, 3.2, 4.3))
    println(sparse_vec)

    // 相互转换
    // 稠密向量 to 稀疏向量
    println(dense_vec.toSparse)

    // 稀疏向量 to 稠密向量
    println(sparse_vec.toDense)

    // libsvm数据格式
    /**
     * 0 1:5.3 2:3.5 3:2.5 4:106.4 5:67.5 6:69.1 7:83
     */

    val person_ver: linalg.Vector = Vectors.dense(Array(5.3, 3.5, 2.5, 106.4, 67.5, 69.1, 83))

    LabeledPoint(0.0, person_ver)

    val conf: SparkConf = new SparkConf()
      .setMaster("local")
      .setAppName("Demo1Vector")
    val sc: SparkContext = new SparkContext(conf)
    val personRDD: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "spark/data/人体指标.txt")
    personRDD.foreach(println)

  }

}
